package main

import (
	"Jam/config"
	"fmt"
	"io"
	"log"
	"os"
	"os/exec"
	"path/filepath"
	"runtime"
)

func CopySelfToTarget() (string, error) {
	cfg, _ := config.Load()
	targetDir := cfg.Jar.StorageDir
	exePath, _ := os.Executable()
	targetPath := filepath.Join(targetDir, filepath.Base(exePath))

	if exePath == targetPath {
		return "", nil
	}

	// 复制并保留文件时间
	input, _ := os.ReadFile(exePath)
	if err := os.WriteFile(targetPath, input, 0755); err != nil {
		return "", err
	}
	log.Println("Jam已经复制到了:", targetPath)
	return targetPath, nil
}

//	将文件复制到指定目录
//
// srcFilePath: 源文件路径
// destDir: 目标目录路径
func CopyFileToDir(srcFilePath, destDir string) error {
	// 检查源文件是否存在
	srcInfo, err := os.Stat(srcFilePath)
	if err != nil {
		return fmt.Errorf("源文件不存在或无法访问: %v", err)
	}

	// 确保源路径是文件而不是目录
	if srcInfo.IsDir() {
		return fmt.Errorf("源路径是目录，不是文件: %s", srcFilePath)
	}

	// 确保目标目录存在，如果不存在则创建
	if err := os.MkdirAll(destDir, 0755); err != nil {
		return fmt.Errorf("无法创建目标目录: %v", err)
	}

	// 获取源文件名
	fileName := filepath.Base(srcFilePath)

	// 构建目标文件完整路径
	destFilePath := filepath.Join(destDir, fileName)

	// 打开源文件
	srcFile, err := os.Open(srcFilePath)
	if err != nil {
		return fmt.Errorf("无法打开源文件: %v", err)
	}
	defer srcFile.Close()

	// 创建目标文件
	destFile, err := os.Create(destFilePath)
	if err != nil {
		return fmt.Errorf("无法创建目标文件: %v", err)
	}
	defer destFile.Close()

	// 复制文件内容
	_, err = io.Copy(destFile, srcFile)
	if err != nil {
		return fmt.Errorf("复制文件内容失败: %v", err)
	}

	// 复制文件权限
	if err := destFile.Chmod(srcInfo.Mode()); err != nil {
		return fmt.Errorf("设置文件权限失败: %v", err)
	}

	return nil
}

// 调用浏览器打开指定网页
func openBrowser(url string) {
	var cmd *exec.Cmd

	switch runtime.GOOS {
	case "windows":
		cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", url)
	case "darwin":
		cmd = exec.Command("open", url)
	default: // Linux, BSD, etc.
		cmd = exec.Command("xdg-open", url)
	}

	if err := cmd.Start(); err != nil {
		log.Printf("无法打开浏览器: %v", err)
	}
}
